#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdint.h>

#include "debug.h"
#include "os_api.h"
#include "time_api.h"
#include "ps_api.h"
#include "dev_api.h"

#define _STACK_SIZE		(1024*3)
static void* _task_stack = NULL;

static OSTaskRef _task_ref = NULL;

static OSATimerRef _task_delete_timer_ref = NULL;

void wait_network_ready(void)
{
    int count = 30;
    while(count-- && ps_GetNetworkReady() == FALSE){	
        OSATaskSleep(200);
    }

    if (count <= 0){
        LOG_PRINTF("dev_CtrlReset.\n");
        dev_CtrlReset(0);
    }
}

void utc_time_display(void)
{
	t_rtc currUtcTime = {0};

	UINT32 currTotalSeconds = time(NULL);
  
	pmic_rtc_to_tm(currTotalSeconds, &currUtcTime);

	LOG_PRINTF("UTC TIME: \"%02d/%02d/%02d,%02d:%02d:%02d\n\r\n", 
        (currUtcTime.tm_year)%100, currUtcTime.tm_mon, currUtcTime.tm_mday, currUtcTime.tm_hour, currUtcTime.tm_min, currUtcTime.tm_sec);
}

void beijing_time_display(void)
{
	t_rtc currUtcTime = {0};

	UINT32 currTotalSeconds = time(NULL);

    currTotalSeconds += 8*60*60;

	pmic_rtc_to_tm(currTotalSeconds, &currUtcTime);

	LOG_PRINTF("UTC TIME: \"%02d/%02d/%02d,%02d:%02d:%02d\n\r\n", 
        (currUtcTime.tm_year)%100, currUtcTime.tm_mon, currUtcTime.tm_mday, currUtcTime.tm_hour, currUtcTime.tm_min, currUtcTime.tm_sec);
}



char *lte_module_ntp_get_server(void);
void lte_module_ntp_set_server(char * ntp_server);
void lte_module_ntp_request(int sync, void (*ntp_cb)(int, char *));
void lte_module_time_set(t_rtc *setTime, int *timezone);
void lte_module_time_get(t_rtc *getTime, int *timezone, int *tztype);

#ifndef ABS
#define ABS(x)   ((x)<0   ?(-(x)):(x))
#endif

void ntp_req_callback(int result, char * timestr)
{
    // ntp请求成功
    if (result == 0){
        LOG_PRINTF("ntp_req_callback %s\n", timestr);
    }
}

static void _task(void *ptr)
{    	
    t_rtc utcTime = {0};
    int timezone = 0;
    int tztype = 0;

    wait_network_ready();


/****1.获取时间   --注册网络后可能稍有延迟，判定时间不是70年，即可判定时间获取成功*****/
    // 开机网络注册后，模块有两种方式获取时间 
    // 第一种，NITZ，注册的同时基站同步时间，该种方式，会自动同步timezone，且是准确的，国内移动电信卡是该种同步方式
    // 第二种，NTP，注册数据可用后通过NTP请求时间，该种方式，不会自动同步timezone，timezone内置的（默认北京时区+32(每十五分钟一个小 时区 +8*4)），或者主动设置的
    OSATaskSleep(2*200);
    lte_module_time_get(&utcTime, &timezone, &tztype);
    if (tztype == 1/*NITZ同步的时区，时区准确*/){
        LOG_PRINTF("LOCAL TIME: \"%02d/%02d/%02d,%02d:%02d:%02d%c%02d\n", 
            (utcTime.tm_year)%100, utcTime.tm_mon, utcTime.tm_mday, utcTime.tm_hour, utcTime.tm_min, utcTime.tm_sec, timezone > 0? '+' : '-', ABS(timezone)/15);
    }else{
        // 时区需要客户自行确定
        LOG_PRINTF("Custom TIME: \"%02d/%02d/%02d,%02d:%02d:%02d%c%02d\n", 
            (utcTime.tm_year)%100, utcTime.tm_mon, utcTime.tm_mday, utcTime.tm_hour, utcTime.tm_min, utcTime.tm_sec, timezone > 0? '+' : '-', ABS(timezone)/15);
    }

    OSATaskSleep(100);

/****2.修改ntp服务器   *****/
    LOG_PRINTF("net_server %s.\n", lte_module_ntp_get_server());
    // 设置的ntp_server会保存在模块中，下次重启，模块自行触发的ntp服务器将使用该ntp_server
    if (strcmp(lte_module_ntp_get_server(), "ntp1.aliyun.com") == 0)
        lte_module_ntp_set_server("ntp2.aliyun.com");
    else 
        lte_module_ntp_set_server("ntp1.aliyun.com");
    LOG_PRINTF("net_server %s.\n", lte_module_ntp_get_server());

/****3.主动发起NTP请求   *****/
    // 第一个参数：0：请求的时间不同步到系统中，1：请求的时间同步到系统中
    lte_module_ntp_request(1, ntp_req_callback);

/****4.修改Local Time   *****/
    // utcTime.tm_year = 2025;
    // utcTime.tm_mon = 11;
    // utcTime.tm_mday = 22;
    // utcTime.tm_hour = 11;
    // utcTime.tm_min = 22;
    // utcTime.tm_sec = 10;

    // timezone = -32;
    // //lte_module_time_set(&utcTime, NULL);  // 如果不修改时区可以设置为NULL
    // lte_module_time_set(&utcTime, &timezone);

    while(1){
        
        lte_module_time_get(&utcTime, &timezone, &tztype);
        if (tztype == 1/*NITZ同步的时区，时区准确*/){
            LOG_PRINTF("LOCAL TIME: \"%02d/%02d/%02d,%02d:%02d:%02d%c%02d\n", 
                (utcTime.tm_year)%100, utcTime.tm_mon, utcTime.tm_mday, utcTime.tm_hour, utcTime.tm_min, utcTime.tm_sec, timezone > 0? '+' : '-', ABS(timezone)/15);
        }else{
            // 时区需要客户自行确定
            LOG_PRINTF("Custom TIME: \"%02d/%02d/%02d,%02d:%02d:%02d%c%02d\n", 
                (utcTime.tm_year)%100, utcTime.tm_mon, utcTime.tm_mday, utcTime.tm_hour, utcTime.tm_min, utcTime.tm_sec, timezone > 0? '+' : '-', ABS(timezone)/15);
        }

        utc_time_display();    
        beijing_time_display();

        OSATaskSleep(10*200);
    }

}

extern void status_monitor_int(void);

int main(void)
{	
    int ret;

	_task_stack = malloc(_STACK_SIZE);
    ASSERT(_task_stack != NULL);
	
    ret = OSATaskCreate(&_task_ref, _task_stack, _STACK_SIZE, 100, "_task", _task, NULL);
    ASSERT(ret == OS_SUCCESS);
	
	return 0;
}